/**
 * FileName: LoginService
 * Author: TangZaoBang
 * Date: 2023/06/05 13:09
 * Description: 登录服务
 * <p>
 * History:
 * <author> TangZaoBang
 * <time> 2023/06/05 13:09
 * <version> 1.0.0
 * <desc> 版本描述
 */
package com.sd365.permission.centre.service;

import com.sd365.permission.centre.entity.Role;
import com.sd365.permission.centre.entity.User;
import com.sd365.permission.centre.pojo.dto.UserDTO;
import com.sd365.permission.centre.pojo.vo.ResourceVO;
import lombok.Data;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotNull;
import java.util.List;


/**
 * 实现登录功能，网关通过路由首先进行doAuth取得信息生成token
 * 之后通过UserInfo取得对应用户信息
 * @author TangZaoBang
 * @date 2023/06/15 01:46
 * @version 1.0.0
 *
 */
public interface LoginService {


    /**
     * 错误的租户
     */
   int LOGIN_VERIFY_CODE_TENANT_ERR=0;
    /**
     * 认证成功 账号 密码 租户一致
     */
    int LOGIN_VERIFY_CODE_SUCCESS=1;
    /**
     *  账号或者密码错误
     */
    int LOGIN_VERIFY_CODE_CODE_OR_PASSWORD_ERR=2;


    @Data
    class LoginUserDTO{
        /**
         * 带回认证的错误码
         */
        private Integer resultCode;
        private Long id;
        private Long tenantId;
        private Long orgId;
        private Long companyId;
        private String name;
        private String tel;
        private List<Long> roleIds;

    }
    @Data
    class UserVO {
        /**
         * 名字
         */
        private String name;
        /**
         * 电话号码
         */
        private String tel;
        /**
         * 主键雪花算法生成
         */
        private Long id;
        /**
         * 消息和错误码 这个设计不好，返回保卫已经被统一应答包装 CommonResponse的Head包含了 code和message 这里不需要了
         */
        private String msg;
        private Integer code;
        private Long tenantId;
        private String companyAddress;
        private Long orgId;
        private Long companyId;
        public ResponseData data;
        private List<Long> roleIds;
    }
    @Data
    class ResponseData {
        /**
         * 生成的token ，token在认证服务生成比较合理
         */
        private String token;
        /**
         *  一个用户可以拥有多个角色这里是id
         */
        private List<String> roles;
        /**
         *  名字
         */
        private String name;
        /**
         * 头像地址
         */
        private String avatar;
        /**
         *  用户所拥有的资源，如果在 Role对象中包含这个会更好
         */
        private List<ResourceVO> resourceVO;
    }

    /**
     * 重写登录方法
     * @author TangZaoBang
     * @date 2023/06/05 15:58
     * @param code 工号
     * @param password 密码
     * @param account 租户账号
     * @return com.sd365.permission.centre.pojo.vo.UserVO
     */
    UserVO login(String code, String password, String account);

    /**
     * 验证登录用户状态：账号(code)和租户(account)不匹配，即 "该账户不存在"，返回0
     *  账号和租户匹配，但密码错误，返回2
     *  账号和租户存在数据库且匹配，以及密码正确，则登录成功，返回1
     * @author TangZaoBang
     * @date 2023/06/10 13:29
     * @param code code
     * @param password password
     * @param account account
     * @return int 账号错误  1:登录成功  2:密码错误
     */
    int verification(String code, String password, String account);

   /**
    * 通过工号和租户返回用户信息
    * @author TangZaoBang
    * @date 2023/06/15 01:43
    * @param code 工号
    * @param account 租户账号
    * @return com.sd365.permission.centre.entity.User 用户信息
    */
    User getUserInfo(String code, String account);

    /**
     * 通过用户id 获得用户对应角色
     * @author TangZaoBang
     * @date 2023/06/15 01:44
     * @param userId 用户id
     * @return java.util.List<com.sd365.permission.centre.entity.Role> 所拥有的资源 如果角色没有资源方法返回 null
     */
    List<Role> getRolesByUserId(@Validated @NotNull Long userId);


    /**
     * 取得角色对应的资源
     * @author TangZaoBang
     * @date 2023/06/15 01:45
     * @param roles 当前用户的所有的角色
     * @return java.util.List<com.sd365.permission.centre.pojo.vo.ResourceVO> 所拥有的资源 如果角色没有资源方法返回 null
     */
    List<ResourceVO> getResourceVO(List<Role> roles);


    /**
     * 用户登陆成功修改用户状态
     * @author TangZaoBang
     * @date 2023/06/15 02:05
     * @param userId 用户userId
     * @param status 状态status
     * @return java.lang.Boolean 成功true，失败false
     */
    Boolean updateUserOnlineStatus(Long userId,byte status);


    /**
     *重构方法 认证和更新用户状态
     * @author TangZaoBang
     * @date 2023/06/10 16:54
     * @param code 账号
     * @param password  密码
     * @param account  租户号
     * @return com.sd365.permission.centre.pojo.vo.UserVO   LoginUserDTO.resultCode=0 和 2 代表失败，1 代表成功 成功情况下包含其他信息
     */
    UserDTO auth(@Validated @NotNull String code,
                 @Validated @NotNull String password,
                 @Validated @NotNull String account);



}
